package com.kuang.lambda;

import java.util.ArrayList;
import java.util.List;

/**
 * 【Java异常】Variable used in lambda expression should be final or effectively final
 * http://t.csdn.cn/l5vsp
 * http://t.csdn.cn/hlF72
 *
 * 背景描述
    * 最近在使用Java8 lambda表达式的时候编辑品，会时不时遇到这样的编译报错，如下图所示：
    * 从字面上来理解这句话，意思是：lambda表达式中使用的变量应该是final或者有效的final，也就是说，lambda 表达式只能引用标记了 final 的外层局部变量，这就是说不能在 lambda 内部修改定义在域外的局部变量，否则会编译错误。
 * 报错原因
     * 在lambda表达式中对变量的操作都是基于原变量的副本，不会影响到原变量的值。
     * 假定没有要求lambda表达式外部变量为final修饰，那么开发者会误以为外部变量的值能够在lambda表达式中被改变，而这实际是不可能的，所以要求外部变量为final是在编译期以强制手段确保用户不会在lambda表达式中做修改原变量值的操作。
     * 为什么会有这种规定？
     * 其实在 Java 8 之前，匿名类中如果要访问局部变量的话，那个局部变量必须显式的声明为 final
 */
public class Test1 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(){{
            add("1121");
            add("11212");
            add("11213");
        }};



        for (int i = 0; i < 10; i++) {
            int finalI = i;  //因为 i 是变量，不能定义为 final, 但是lambda要求，局部变量要求是final定义的，所以需要转一下
            list.forEach(e ->{
                System.out.println("fjsadfjk"+ finalI);
            });
        }


    }
}
